package com.example.demo.dao;

import com.example.demo.entity.Product;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface ProductService extends JpaRepository<Product, Long>, JpaSpecificationExecutor<Product> {
    /**
     * 利用方法名表示查询条件
     * @param name 产品名称
     * @return List<Product>
     */
    List<Product> findProductsByName(String name);

    /**
     * 利用方法名表示查询条件
     * @param name 产品名称
     * @return List<Product>
     */
    List<Product> findProductsByNameContaining(String name);

    /**
     * 找符合价格区间的产品
     * @param price1 价格区间的较小值
     * @param price2 价格区间的较大值
     * @return List<Product>
     */
    List<Product> findProductsByPriceBetween(Float price1, Float price2);

    /**
     * 使用JPQL根据多个条件组合动态查询。参数为null时不做查询条件
     * @param productType 产品类型
     * @param price 产品单价
     * @return 能够通配对应产品类型productType且大于对应产品价格price的产品
     */
    @Query("select p from Product p where (?1 = null or productType like %?1%) and (?2 = null or price > ?2)")
    List<Product> findWithJPQLByProductTypeAndPrice(String productType, Float price);

    /**
     * 使用SQL查询
     * @param name 产品名称
     * @return 按照名称搜索的结果
     */
    @Query(value="select * from product where name like %?1%", nativeQuery = true)
    List<Product> findWithSQLByName(String name);

    /**
     * 根据name模糊查询，并分页
     * @param name 产品名称
     * @param pageable 分页与排序的条件
     * @return 返回查询结果
     */
    Page<Product> findByNameContaining(String name, Pageable pageable);

    public void deleteProductByNameContaining(String name);
}
